/**
 * @file 常数定义
 * @author DuskyHuang 圣子
*/

import { Color, DynamicAtlasManager, Layers, macro, Vec3, view } from "cc";
import { isCN } from "../../../preload/scripts/env";
/** ——————————— 环境设置 ——————————— **/
// 动态图集，在不同平台打包下改变下面的参数
// macro.CLEANUP_IMAGE_CACHE = false;
// DynamicAtlasManager.instance.enabled = true;
// DynamicAtlasManager.instance.maxAtlasCount = 3;
// DynamicAtlasManager.instance.textureSize = 2048;
DynamicAtlasManager.instance.enabled = false;

/** ——————————— 天文常量 ——————————— **/

// 天文单位公里数
export const KM_OF_AU = 1.496e+8;

// 光年天文单位数
export const AU_OF_LY = 63240;

// 天文单位公里数      
export const KM_OF_LY = 9.4607e+12;

// 光年刻度的世界尺寸差
export const POW_OFS: pow10 = -0.0241;

// 光速（km/s）
export const LIGHT_SPEED = 3e5;

// 地轴倾角
export const INCLINE: num.deg = -23.5;

// 坐标系相对极轴偏移
export const AxisRotation = {
    HORIZONTAL: new Vec3(0, 0, 0),          // 地平
    EQUATORIAL: new Vec3(0, 0, INCLINE),    // 赤道
    ECLIPTIC: new Vec3(0, 0, 0),            // 黄道
    GALACTIC: new Vec3(82.6, 120.8, 12.5),  // 银道
    SOLAR_DIR: new Vec3(0.407, -0.86, -0.305),// 太阳绕银河系方向
}

// 天文尺度
export const Pow10 = {
    TerminationShock: -2.898,   // 终端激波
    AU100: -2.801,              // 百天文单位 
    HelioPause: -2.722,         // 日球层顶 
    LightDay: -2.563,           // 一光天 
    BowShock: -2.403,           // 弓形激波 
    AU1k: -1.801,               // 千天文单位
    AU10k: -0.801,              // 万天文单位
    OortCloud: -0.301,          // 奥尔特云
    LightYear: 0,               // 一光年
}

// 距离地球最近的恒星距离：比邻星（南门二，半人马座α）
export const NEAREST_STAR: lightyear = 4.2;

// 星座族
export enum ConstGroup {
    NONE = 0,           // 不显示
    ZODIAC = 1,         // 黄道星座：包括黄道13星座，除常见的12个传统星座，还包含蛇夫座。
    URSA = 1 << 1,      // 大熊族：包括大熊座及周围属于北半球的星座，大多与动物有关，共有10个星座。
    PERSEUS = 1 << 2,   // 英仙族：包括英仙座以及与英仙珀耳修斯的故事有关的星座，共有9个星座。
    HERCULES = 1 << 3,  // 武仙族：包括武仙座以及与武仙海格力斯的故事有关的星座，共有18个星座。
    ORION = 1 << 4,     // 猎户族：包括猎户座与及猎人俄里翁的两只猎犬及猎物，共有5个星座。
    OCEANIC = 1 << 5,   // 幻之水族：包含一些与海洋有关的星座，大部分都在南半球，共有9个星座。
    BAYER = 1 << 6,     // 拜耳族：由天文学家约翰·拜耳命名的星座，大多与动物有关，共有11个星座。
    LACAILLE = 1 << 7,  // 拉卡伊族：由天文学家尼可拉·路易·拉卡伊命名的星座，大多都是科学的用具，共有13个星座。
    ALL = (1 << 8) - 1, // 全天星座：现代88星座
}

// 恒星光谱特征，参见赫罗图
export enum StarSpectrum {
    O = 0,          // 蓝色     星表40,000-25,000K。紫外连续谱强，有电离氦，中性氦和氢线。二次电离碳、氮、氧线较弱。
    B,              // 蓝白色   星表25,000-12,000K。氢线强，中性氦线明显，无电离氦线，但有电离碳、氮、氧和二次电离硅线。
    A,              // 白色     星表12,000-7,600K。氢线非常强，氦线消失，出现电离镁和电离钙线。
    F,              // 黄白色   星表7,600-6,000K。氢线强，但比A型弱。电离钙线大大增强变宽，出现许多金属线。
    G,              // 黄色     星表6,000-5,000K。氢线变弱，金属线增强，电离钙线很强很宽。
    K,              // 橙色     星表5,000-3,600K。氢线弱，金属线比G型强得多。
    M,              // 红色     星表3,600-2,600K。氧化钛分子带最突出，金属线强，氢线很弱。
    /* 以下为一些少见的光谱类型，只适用于极少数恒星 */
    C,              // 深红色   星表2,500-3,500K。碳星，红巨星晚期。例如，狮子座CW。
    W,              //          星表25,000-50000K。沃夫-瑞叶星（或称沃尔夫-拉叶星）。例如，WR 102。
    L,              //          星表1,500-2,000K。恒星的质量不足以让氢的核聚变持续进行的棕矮星。L代表锂，在恒星内会很快的蜕变。
    T,              //          星表500k-1,000K。比棕矮星温度更低的恒星，在光谱中有甲烷的谱线。
    Y,              // 棕色     星表500k。棕矮星温度最低的一种，例如WISE 1541-2250，它只有木星的12倍质量，表面温度更是只有400K。
    R,              // 暗橙色   以前是光谱中有碳星谱线的K型恒星。
    N,              // 暗红色   以前是光谱中有碳星谱线的M型恒星。
    S,              // 暗红色   原本是M型的恒星，但正常的氧化锑谱线被氧化锌谱线取代。
    D,              // 白矮星。例如，天狼星B
    Q,              // 中子星。例如，PSR B1257+12，已发现3颗行星和一颗矮行星环绕。
    X,              // 黑洞。例如，天鹅座X-1。
}

// 深空天体类型（梅西耶天体+命名星系）
export enum DeepSkyObjectType {
    GlobularCluster = 1,    // 球状星团
    OpenCluster = 2,        // 疏散星团
    DoubleStars = 3,        // 双星系统
    GroupedStars = 4,       // 星群系统
    EmissiveNebula = 11,    // 发射星云
    ReflectiveNebula = 12,  // 反射星云
    PlanetaryNebula = 13,   // 行星状星云
    MilkyWayStarCloud = 14, // 银河系恒星云
    SupernovaRemnant = 15,  // 超新星遗骸
    EllipticalGalaxy = 20,  // 椭圆星系
    SpiralsGalaxy = 21,     // 螺旋星系
    BarredSpiralGalaxy = 22,// 棒旋星系
    IrregularGalaxy = 23,   // 不规则星系
    StarBurstGalaxy = 24,   // 星爆星系
    LenticularGalaxy = 25,  // 透镜星系（介于椭圆和螺旋之间的星系）
    DwarfGalaxy = 29,       // 矮星系/卫星星系
}


export const SOLAR_IN_MILKY = new Vec3(-0.235, 0, 2.265);       // 太阳系相对银河坐标（光年）
export const MILKY_TO_SOLAR = new Vec3(0.119, -2.244, -0.37);   // 银河中心相对太阳系坐标（光年）
export const LOCAL_TO_SOLAR = new Vec3(0.496, 0.697, 0.937);    // 本群中心相对太阳系坐标（光年）
export const M31_TO_SOLAR = new Vec3(0.991, 1.394, 1.874);      // 仙女座星系相对太阳系坐标（百万光年）
export const M33_TO_SOLAR = new Vec3(1.409, 0.902, 2.149);      // 三角座星系相对太阳系坐标（百万光年）
export const VIRGO_TO_SOLAR = new Vec3(-0.019, 0.133, -0.534);  // 本超群中心相对太阳系坐标（亿光年）

// 主范围直径描述
export const Diameters = {
    SOLAR: 1.496 * 79,      // 狭义太阳系（亿公里）
    HELIO: 1.496 * 500,     // 广义太阳系（百亿公里）
    MILKY: 10,              // 银河系（万光年）
    LOCAL: 10,              // 本星系群（百万光年）
    VIRGO: 1.1,             // 室女座超星系团（亿光年）
    LANIAKEA: 5.2,          // 拉尼亚凯亚超星系团（亿光年）
    HUBBLE: 930,            // 哈勃尺度（亿光年）
}

/** ——————————— 时间常量 ——————————— **/

export const SEC_PER_MIN = 60;  // 分秒
export const MIN_PER_HOUR = 60; // 时分
export const HOUR_PER_DAY = 24; // 时秒
export const DAY_PER_WEEK = 7;  // 周日
export const DAY_PER_MONTH = 30.5;// 月日
export const DEG_PERIGON = 360; // 周角
export const DEG_PI = 180;      // PI角
export const DEG_RIGHT = 90;    // 直角
export const DEG_RIGHT_2 = 45;  // 半角
export const SEC_PER_HOUR = SEC_PER_MIN * MIN_PER_HOUR; // 时秒
export const DEG_PER_HOUR = DEG_PERIGON / HOUR_PER_DAY; // 时角

export enum Timer {
    STOP = 0, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, YEAR
}

/** ——————————— 视图常量 ——————————— **/

// 绝对星等=0的半径
export const STAR_R0 = 1;

// 恒星命名方式
export enum StarNameType {
    ALPHABET = 1,   // 拜耳编号
    NAMED = 2,      // 中西方命名（西方命名+中国星官）
    HD = 3,         // 亨利·德雷伯星表
    HIP = 4,        // 依巴谷星表和第谷星表
}

// 恒星显示等级
export enum StarLevel {
    NONE = 0,       // 不显示
    LEVEL_1 = 2,    // 一等星以上
    LEVEL_2 = 3,    // 二等星以上
    LEVEL_3 = 4,    // 三等星以上
    LEVEL_4 = 5,    // 四等星以上
    LEVEL_5 = 6,    // 五等星以上
}

// 深空天体命名方式
export enum DeepNameType {
    NONE = 0,      // 不显示
    NAMED = 1,     // 西方命名|中国命名
    MESSIER = 2,   // 梅西耶编号
    NGC_IC = 3,    // NGC天体表/索引天体表编号
}

export const LAYER_UI_BG = Layers.nameToLayer('UI_BG');     // 背景UI层
export const LAYER_UI_2D = Layers.nameToLayer('UI_2D');     // 前景UI层
export const LAYER_BG_3D = Layers.nameToLayer('CONS_3D');   // 深空3D层
export const LAYER_MAIN_3D = Layers.nameToLayer('MAIN_3D'); // 主3D层
export const LAYER_GIZMOS = Layers.nameToLayer('GIZMOS');   // 指示层

// 天球坐标网格度
export const DEG_COORD_GRID: num.deg = 10;

/** ——————————— 资源常量 ——————————— **/
// 资源引用和数据
export const Res = {
    Sheets: {
        CULTURE: '星座文化',
        MESSIER_CELL_NUM: 16,
        MESSIER_DEFAULT: [156, 2],
        MESSIER_DEFAULT_BIG: [176, 2],
        CULTURE_CELL_NUM: 8,
        PLANETS_LOD_GIRDS: {
            ROW: 8,
            COL: 4,
        },
        DSM01_LOD_GIRDS: {
            ROW: 4,
            COL: 2,
        },
        DSM2_LOD_GIRDS: {
            ROW: 8,
            COL: 4,
        },
        PRESET: 'preset',
        UI_BORDER: 'ui-border',
        UI_ICON: 'ui-icon',
        UI_POPS: 'ui-pops',
        UI_ICON_DEFAULT: 'icon_default',
    },
    Textures: {
        MILKY_WAY: 'textures/milky-way',
        CELESTIAL: 'textures/celestial',
        AST_PLANES: 'textures/planetary/astronomical-planes/texture',
        CELESTIAL_4K: 'textures/celestial-4k',
        CONST_COMBINE: 'textures/stellar/constellations-key/texture',
    },
    Prefabs: {
        STAR_PRECISE: 'star-precise',
        CULTURE_QUAD: 'culture-quad',
        SUBSTRUCTURE: 'sphere-substructure',
        ACANTHO: 'sphere-acantho',
        STARS_GPU: 'stars-gpu',
        GALAXIES_GPU: 'galaxies-gpu',
        COMPANIONS_GPU: 'companions-gpu',
        MILKY_CLOUD: 'milky-cloud',
        SUN: 'sun',
        PLANET: 'planet',
        DSM: 'dsm',
        COMET: 'comet',
        ASTEROID: 'asteroid',
        SATELLITE: 'satellite',
        SCOPE: 'cylinder-scope',
        SUPER_CLUSTERS: 'super-clusters',
        LENS_PANEL: 'lens-panel',
        INTRO_PANEL: 'intro-panel',
        VISIT_PANEL: 'visit-panel',
        GUIDE_PANEL: 'guide-panel',
    },
    Configs: {
        SOLAR_PLANETS: 'solar-planets',
        SOLAR_DWARFS: 'solar-dwarfs',
        SOLAR_MINORS: 'solar-minors',
        SOLAR_COMETS: 'solar-comets',
        ASTEROID_BELTS: 'asteroid-belts',
        PLANETARY_SATELLITES: 'planetary-satellites',
        SUBSTRUCTURES: 'substructures',
        DEEP_SKY_OBJECTS: 'deep-sky-objects',
        CONSTELLATION_STARS: 'constellation-stars',
        VISITABLE_STARS: 'visitable-stars',
        VISITABLE_BLACK_HOLES: 'visitable-blackholes',
        I18N: 'i18n',
    },
    Materials: {
        PlanetPresets: {
            EARTH: 'earth',
            WINDY: 'windy',
            TERRESTRIAL: 'terrestrial',
            GIANT: 'giant',
        }
    }
}

export const SceneGraph = {
    COSMOS: 'Cosmos',
    Cameras: {
        MAIN: 'Main Camera',
        DEEP: 'Deep Sky Camera',
    },
    MAIN_LIGHT: 'Main Light',
    MILKY: 'MilkyWay',
    Milky: {
        CLUSTERS: 'Milky.CLusters',
        NEBULAS: 'Milky.Nebulas',
    },
    STELLAR: 'Stellar',
    LOCAL: 'LocalGG',
    Local: {
        GALAXIES: 'Local.Galaxies'
    },
    VIRGO: 'VirgoSC',
    Virgo: {
        GALAXIES: 'Virgo.Galaxies'
    },
    SOLAR: 'Solar',
    Solar: {
    },
    HELIO: 'Helio',
    PLANETARY: 'Planetary',
    Planetary: {
        SATELLITES: 'Satellites',
    },
    SPECIFIC: 'Specific',
}

export const NOTFOUND_SHEET_ID = -99;

/** ——————————— UI常量 ——————————— **/

export const INIT_LANG: language = isCN() ? 'cn' : 'en';
export const LANGUAGES: language[] = ['cn', 'en'];
export const ASPECT_RATIO = view.getVisibleSize().height / view.getVisibleSize().width;
export const I8: bit8 = 255;

export enum TransformEnum {
    NONE = 0,
    SUN_2_PLN = 1,
    SUN_2_SAT = 2,
    PLN_2_SAT = 3,
    PLN_2_PLN = 4,
    SAT_2_SAT = 5,
    PLN_2_SUN = 6,
    SAT_2_PLN = 7,
    SAT_2_SUN = 8,
    SUN_2_SPC = 9,
    SPC_2_SUN = 10,
    SPC_2_SPC = 11,
}

export const TRANS_2_PLN = [TransformEnum.SUN_2_PLN, TransformEnum.SAT_2_PLN, TransformEnum.PLN_2_PLN];
export const TRANS_2_SAT = [TransformEnum.SUN_2_SAT, TransformEnum.PLN_2_SAT, TransformEnum.SAT_2_SAT];
export const TRANS_2_SUN = [TransformEnum.PLN_2_SUN, TransformEnum.SAT_2_SUN, TransformEnum.SPC_2_SUN];
export const TRANS_INTER = [TransformEnum.SUN_2_SPC, TransformEnum.SPC_2_SUN, TransformEnum.SPC_2_SPC];
export const interstellar: into[] = ['star', 'constellation', 'nebula', 'cluster', 'galaxy', 'blackhole'];

export const FIXED_ICONS = {
    SUN: { into: 'star', name: 'Sun' },
    PLANETS: [
        { into: 'planet', name: 'Mercury' },
        { into: 'planet', name: 'Venus' },
        { into: 'planet', name: 'Earth' },
        { into: 'planet', name: 'Mars' },
        { into: 'planet', name: 'Jupiter' },
        { into: 'planet', name: 'Saturn' },
        { into: 'planet', name: 'Uranus' },
        { into: 'planet', name: 'Neptune' }
    ],
    DWARFS: [
        { into: 'dwarf', name: 'Ceres' },
        { into: 'dwarf', name: 'Pluto' },
        { into: 'dwarf', name: 'Haumea' },
        { into: 'dwarf', name: 'Makemake' },
        { into: 'dwarf', name: 'Eris' },
        { into: 'belts', name: 'Main Belt' },
        { into: 'belts', name: 'Kuiper Belt' },
        { into: 'comet', name: 'Halley' },
    ],
    STARS10: [
        { into: 'star', name: 'Sirius' },
        { into: 'star', name: 'Canopus' },
        { into: 'star', name: 'Rigil Kentaurus' },
        { into: 'star', name: 'Arcturus' },
        { into: 'star', name: 'Vega' },
        { into: 'star', name: 'Capella' },
        { into: 'star', name: 'Rigel' },
        { into: 'star', name: 'Procyon' },
        { into: 'star', name: 'Achernar' },
        { into: 'star', name: 'Betelgeuse' }
    ],
    STARS20: [
        { into: 'star', name: "Hadar" },
        { into: 'star', name: "Altair" },
        { into: 'star', name: "Acrux" },
        { into: 'star', name: "Aldebaran" },
        { into: 'star', name: "Antares" },
        { into: 'star', name: "Spica" },
        { into: 'star', name: "Pollux" },
        { into: 'star', name: "Fomalhaut", },
        { into: 'star', name: "Deneb" },
        { into: 'star', name: "Mimosa" }
    ],
    STARS30: [
        { into: 'star', name: "Regulus" },
        { into: 'star', name: "Adhara" },
        { into: 'star', name: "Castor" },
        { into: 'star', name: "Shaula" },
        { into: 'star', name: "Gacrux" },
        { into: 'star', name: "Bellatrix" },
        { into: 'star', name: "Elnath" },
        { into: 'star', name: "Miaplacidus" },
        { into: 'star', name: "Alnilam" },
        { into: 'star', name: "Alnair" }
    ],
    BH07: [
        { into: 'blackhole', name: "Gaia-BH1" },
        { into: 'blackhole', name: "Gaia-BH3" },
        { into: 'blackhole', name: "Gaia-BH2" },
        { into: 'blackhole', name: "A0620-00" },
        { into: 'blackhole', name: "O2011B0462" },
        { into: 'blackhole', name: "J1118+480" },
        { into: 'blackhole', name: "Cyg-X1" },
    ],
    // TO ADD
    BH14: [
        { into: 'blackhole', name: "Cyg-V404" },
        { into: 'blackhole', name: "GRO-J0422+32" },
        { into: 'blackhole', name: "GS-2000+25" },
        { into: 'blackhole', name: "Cyg-X3" },
        { into: 'blackhole', name: "GRO-J1655-40" },
        { into: 'blackhole', name: "Sgr-A" },
        { into: 'blackhole', name: "IL-Lupi" },
    ],
}

/** @tips 使用较为统一的颜色和字号有助于节省系统字体的CHAR模式的纹理占用 */
export const FONT_BIG = 24;
export const FONT_MID = 20;
export const FONT_SML = 16;
export const LBL_PURPLE = new Color(158, 158, 255, 255);
export const LBL_MAGENTA = new Color(255, 127, 255, 255);
export const LBL_YELLOW = new Color(255, 255, 31, 255);
export const LBL_GREEN = new Color(31, 255, 127, 255);
export const LBL_BROWN = new Color(191, 127, 63, 255);
export const LBL_GRAY = new Color(143, 143, 143, 255);
export const LBL_WHITE = new Color(255, 255, 255, 255);
export const LBL_ORANGE = new Color(255, 191, 127, 255);
export const LBL_CANT = new Color(255, 191, 127, 255);
export const LBL_CYAN = new Color(127, 255, 255, 255);
export const LBL_ROSE = new Color(255, 63, 31, 255);
export const LBL_BLUE = new Color(63, 153, 255, 255);
export const LBL_NAVY = new Color(63, 153, 153, 255);
export const LBL_UI_NAMES = new Color(63, 153, 153, 255);

export const visitConfigs: visitTabConfigs = null;

/** ——————————— 存储常量 ——————————— **/
export const LocalStorageKeys = {
    GUIDED: 'cocosmos.guided',
    LANG: 'cocosmos.language',
}